package com.tinfeng.oop;

public class JavaInnerClass {
    // 内部类
    // 内部类分为四种：匿名、静态、成员、方法内部类
    /**
     * 成员内部类：
     * 无法声明静态成员
     * 因为两个类，编译后会生成两个文件
     * 实例化时要先new 外部类，再new内部类，也可以在外部类中写一个获取内部类的方法
     * 内部类可以直接访问外部类的变量，有重名时要用到this
     */

    /**
     * 静态内部类：
     * 用 static 声明
     * 静态类的实例化可以不依赖外部类直接实例化
     * 在静态内部类中，只能直接访问外部类的静态成员。
     * 对于内外部类存在同名属性的问题，同样遵循就近原则
     */

    /**
     * 方法内部类：
     * 方法内部类，是定义在方法中的内部类，也称局部内部类。
     *  特点
     * 与局部变量相同，局部内部类也有以下特点：
     *
     * 方法内定义的局部内部类只能在方法内部使用；
     * 方法内不能定义静态成员；
     * 不能使用访问修饰符。
     */

    /**
     * 匿名内部类：
     * 匿名内部类就是没有名字的内部类。使用匿名内部类，通常令其实现一个抽象类或接口
     *
     * 匿名内部类特点：
     * 匿名内部类没有类型名称和实例对象名称；
     * 匿名内部类可以继承父类也可以实现接口，但二者不可兼得；
     * 匿名内部类无法使用访问修饰符、static、abstract 关键字修饰；
     * 匿名内部类无法编写构造方法，因为它没有类名；
     * 匿名内部类中不能出现静态成员。
     */

    /**
     * 内部类作用：
     * 封装性：由于内部类只能外部类访问，对内部类有很好的隐藏，更好的封装
     * 实现多继承：我们知道 Java 不支持多继承，而接口可以实现多继承的效果，但实现接口就必须实现里面所有的方法，有时候我们的需求只是实现其中某个方法，内部类就可以解决这些问题。
     * 解决继承或实现接口时的方法同名问题：假如实现两个类，但两个类中有同名，那内部类解决问题就是在一个类中，做两个类来分别实现方法，避免混淆
     */
}
